NFS(Network File System)是很早期就有的網路檔案分享功能,幾乎所有 Unix 類系統如 Linux 與 macOS 都有支援(Windows 上要弄會比較麻煩),而且使用容易,算是相當泛用的 file server。效能部分幾年前看是比 SAMBA 還要好,不過最近也是有看到文章是 SMB 與 AFP 屌打 NFS 的,這部分就得自己再做測試。
由於它的易用性真的蠻高的,所以家裡如果沒有 Windows 的話蠻建議使用 NFS 取代 SMB or AFP(雖然大多數人家裡應該是 Win + MAC)
環境說明
NFS Server:CentOS 8 Minimal install(IP:192.168.199.169)
Client:Ubuntu 20.04.1(IP:192.168.199.168)
CentOS 8 安裝 NFS-Server
sudo dnf install nfs-utils
執行 NFS Server 並設定開機自動啟動
sudo systemctl start nfs-server.service
sudo systemctl enable nfs-server.service
檢查 service 啟動狀態
sudo systemctl status nfs-server.service
# 執行結果:
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
Active: active (exited) since Thu 2020-08-13 10:24:00 CST; 1min 48s ago
Main PID: 6088 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 4855)
Memory: 0B
CGroup: /system.slice/nfs-server.service
Aug 13 10:24:00 localhost.localdomain systemd[1]: Starting NFS server and services...
Aug 13 10:24:00 localhost.localdomain systemd[1]: Started NFS server and services.
開啟防火牆
sudo firewall-cmd --add-service=nfs --permanent
sudo firewall-cmd --add-service=rpc-bind --permanent
sudo firewall-cmd --add-service=mountd --permanent
sudo firewall-cmd --reload
NFS Server 設定
先簡單的讓 NFS server 分享每個使用者在 server 上各自的 home 目錄讓他們遠端存取,要設定 share folder 及權限只要編輯 /etc/exports 這個檔案即可
# 要分享的目錄 # 允許連線的主機與參數
/home/wade 192.168.199.168(rw,sync)
/home/stanley 192.168.199.170(rw,async)
/tmp 192.168.199.168(rw,all_squash) 192.168.199.170(rw,all_squash)
允許連線的主機有很多種的格式:
.主機 IP
.主機 Hostname
.網段(如 192.168.199.0/24)
.網域(可使用 wildcard 「*」字元)
- rw:可讀可寫
- ro:唯讀
- sync:資料會同步寫入到記憶體與硬碟裡,nfs-utils 1.0.0 版之後該選項為預設
- async:資料會先暫存在記憶體,不會直接寫入硬碟,該選項可以增加效能,但如果機器突然掛掉可能會導致資料不見,在nfs-utils 1.0.0 以前的版本,該選項為預設
- root_squash:如果使用 root 帳號(uid/gid=0)存取資料夾,它的 user 與 groups 會變成 nobody 與 nogroup,安全性上會比較好,該選項為預設
- no_root_squash:不要限縮 root 帳號,可以讓遠端使用者以 root 帳號來存取
- all_squash:無論使用者的身份,一律將身份限縮成 nobody
- no_all_squash:與上面選項相反,一律不限縮為 nobody
- anonuid:自訂匿名使用者的 uid,上面有提到像 all_squash 會把所有使用者變成 nobody,anonuid 可以將遠端使用者的身份指定為 server 上現有的使用者,例如 nfsUser 的 uid 是 1002,如果設定 anonuid=1002,那麼 client 建立檔案時,檔案的擁有者就會是 nfsUser
- anongid:功能同上,自訂匿名使用者的 gid
編輯完後用 exportfs 可以重新掛載 /etc/exports 裡的內容而不用重啟 NFS server
exportfs -arv
- -a:掛載或卸載 /etc/exports 裡的所有資料夾
- -r:重新掛載 /etc/exports 裡的所有資料夾,並同步 /etc/exports 與 /var/lib/nfs/etab
- -u:卸載某個資料夾,搭配 -a 參數就是卸載全部的路徑
- -v:執行指令時將結果輸出到螢幕
# 執行結果:
exporting 192.168.199.168:/tmp
exporting 192.168.199.170:/tmp
exporting 192.168.199.170:/home/stanley
exporting 192.168.199.168:/home/wade
查詢分享目錄完整的掛載參數
exportfs -v
# 執行結果:
/home/wade 192.168.199.168(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/home/stanley 192.168.199.170(async,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/tmp 192.168.199.168(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,all_squash)
/tmp 192.168.199.170(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,all_squash)
可以看到分享資料夾的一些預設參數
使用 Ubuntu 掛載 NFS Server
安裝 nfs-common
sudo apt install nfs-common
使用 showmount 指令可以列出 nfs server 目前可以掛載的內容及允許的主機
showmount -e 192.168.199.169
# 執行結果:
Export list for 192.168.199.169:
/tmp 192.168.199.170,192.168.199.168
/home/stanley 192.168.199.170
/home/wade 192.168.199.168
建立掛載用的空目錄
cd && mkdir nfs_mount
掛載 NFS share 目錄到 ~/nfs_mount
sudo mount -t nfs 192.168.199.169:/home/wade /home/wade/nfs_mount
掛載完可以進去 nfs_mount 目錄建個新檔案來測試
NFS Server 有個比較討厭的地方,如果 clinet 正在掛載中,突然 server 或 client 端死了,或是 service 掛掉,那麼它們其中一邊的連線就會 timeout 並且整個卡死,連帶也影響 df 之類的指令,因此下面一篇就要來介紹 autofs 這個好用的工具
NFS Server 系列文章:
Mac 掛載 NFS 與 Operation not permitted 問題
參考資料:
How to Set Up NFS Server and Client on CentOS 8
鳥哥的 Linux 私房菜 - NFS 伺服器篇